<?php

/**
 * Description of class Session
 * 
 * @version 0.2
 * @author Sander van Belleghem
 * @todo default sessie ophalen uit database wanneer klasse aangeroepen wordt. 
 * Wanneer deze er niet is een nieuwe sessie aanmaken.
 * 
 * Functie maken die sessie ophaalt uit database.
 * Functie maken die sessie var controleert met gebruiker gegevens.
 * Functies moeten nagekeken worden.
 * 
 */

require_once 'defs/Constants.php';
require_once FILE_DB_SESSION;
require_once FILE_DB_CONTROLE;
require_once FILE_CLASS_GEBRUIKER;

class Session {

    private $sessie_id;
    private $sessie_vars = array();
    private $authorisatie;
    private $gebruikersnaam;
    private $wachtwoord;
    private $db_session;
    
    public function __construct(){
        
        session_start();
        
        $this->authorisatie = new Authorisatie();
        $this->controle = new DbControle();
        $this->db_session = new DbSession();
        
    }

    public function session(){
        
    } 
       
    // Getters
    public function getSessieId() {
        return $this->sessie_id;
    }
    
    public function getGebruikersnaam(){
        return $this->gebruikersnaam;
    } 
    
    public function getWachtwoord(){
        return $this->wachtwoord;
    }
    
    // Setters    
    public function setSessieId($sessie_id) {
        $this->sessie_id = $sessie_id;
    }
    
    public function setGebruikersnaam($gebruikersnaam){
        $this->gebruikersnaam = $gebruikersnaam;
    }
    
    // Wachtwoord hashen.
    public function setWachtwoord($wachtwoord){
        $this->wachtwoord = md5($wachtwoord);
    }
    
    /**
    * Check if session is same as in database
    *
    * @return true The data in the session is valid
    *
    * @return false No valid row was found in the database that contains given vars
    */
    public function sessionCheck() {
        if(!empty($_SESSION['sessie_id'])){
            if($this->getSessie($_SESSION['sessie_id'])){
                $this->sessie_vars = $this->db_session->getSessieArray();
            
                $gebruikers_id = $this->getSessieVar('gebruiker_id');
                $voornaam = $this->getSessieVar('voornaam');
                $achternaam = $this->getSessieVar('achternaam');
                
                if($this->db_session->sessionCheck( $gebruikers_id, $voornaam, $achternaam) == true){
                    return true;
                } else {
                    return false;
                } 
            } else {
                return false;
            }
        } else {
            return false; 
        }
    }
    
    /**
    *
    * Function to login
    * 
    * @return true Login was succesfull
    * If login is true, session variable is filled with data from database
    *
    * @return false Login was unsuccesfull. Username/password is wrong
     * 
    */
    public function GebruikerLogin(){
        
        $login = $this->authorisatie->inloggen($this->gebruikersnaam, $this->wachtwoord);
        
        if($login == true){
                            
            $this->addSessieVar('gebruiker_id', $login['gebruiker_id']);
            $this->addSessieVar('voornaam', $login['voor_naam']);
            $this->addSessieVar('achternaam', $login['achter_naam']);
            $this->addSessieVar('sessie_id', $login['sessie_id']);
                       
            $sessie_id = $login['sessie_id'];
            $gebruiker_id = $login['gebruiker_id'];               
            
            $gebruiker = new Gebruiker();
            $gebruiker->setGebruikerId($gebruiker_id);
            $gebruiker->setLoginTime($this->controle->mysql_datetime(date("d-m-Y H:i:s")));
            $gebruiker->updateLoginTime();
                       
            if(!empty($sessie_id)){
                
                if($this->getSessie($sessie_id)){
                    
                    // Sessie update in db
                    $this->updateSessie();
                    
                    $_SESSION['sessie_id'] = $this->db_session->getSessieId();
                    $_SESSION['sessie_array'] = $this->db_session->getSessieArray();
                    $_SESSION['sessie_datetime'] = $this->db_session->getSessieDatetime(); 

                    return true; 
                }
            }    
        } else {
            return false;
        }
    }
    
    /**
    *
    * Function to check if user is logged in
    * 
    * @return true User is logged in
    * 
    * @return false User is not logged in. Data in $sessie_vars is wrong
     * 
    */
    public function ingelogd(){
        return (($this->sessionCheck() == true) ?  true : false);
    }

    /**
    *
    * Function to destroy session data.
    * 
    */
    public function uitloggen(){  
        session_destroy();
    }

    /**
    *
    * Function to fill session_var with given data
    * 
    * @param type $sessie_var_name
    * @param type $sessie_var_content
    * @return false sessie_var_name already exist
     * 
    */
    public function addSessieVar($sessie_var_name, $sessie_var_content) {
        
        if( !isset($this->sessie_vars[$sessie_var_name])){
            $this->sessie_vars[$sessie_var_name] = $sessie_var_content;   
        } else {
            throw new Exception('Ooops at addSessieVar');
        }
    } 

    /**
    *
    * Function to update session_var with given data
    * 
    * @param type $sessie_var_name
    * @param type $sessie_var_content
    * @return false sessie_var_name doesn't exist
     * 
    */
    public function updateSessieVar($sessie_var_name, $sessie_var_content) {
        
        if( isset($this->sessie_vars[$sessie_var_name])){
            $this->sessie_vars[$sessie_var_name] = $sessie_var_content;   
        } else {
            throw new Exception('Ooops at updateSessieVar');
        }
    }   

    /**
    *
    * Function to unset session_var with given data
    * 
    * @param type $sessie_var_name
    *
    * @return false sessie_var_name doesn't exist
    * 
    */    
    public function removeSessieVar($sessie_var_name) {
        
        if( !isset($this->sessie_vars[$sessie_var_name])){
            throw new Exception('Ooops at removeSessieVar');  
        } else {
            unset($this->sessie_vars[$sessie_var_name]);
        }
    }    
    
    /**
    *
    * Function to get sessie_var
    * 
    * @param type $sessie_var
    * 
    * @return true $this->sessie_vars[$sessie_var]
    * 
    * @return false $sessie_var doesn't exist or it doesn't meet the required string lenght
    * 
    */  
    public function getSessieVar($sessie_var) {
        
        if(isset($this->sessie_vars[$sessie_var]) && !(strlen($this->sessie_vars[$sessie_var])<=0) ){
            return $this->sessie_vars[$sessie_var];
        } else {     
            return '';
        }
    }
    
    /**
    *
    * Function to get sessie
    * 
    * @param int $sessie_id
    * 
    * @return true Data that was returned from the database function getSession
    * 
    * @return false $sessie_id is empty
    * 
    */  
    private function getSessie($sessie_id){
        if(!empty($sessie_id)){
            $this->db_session->getSessie($sessie_id);
            return true;
        }
        return false;
    }
    
    /**
    *
    * Function to save sessie
    * 
    * @param array $this->sessie_vars
    * @param datetime Datetime formatted as d-m-Y h:i:s
    * 
    */     
    public function saveSessie(){
        
        $this->db_session->setSessieArray($this->sessie_vars);
        $this->db_session->setSessieDatetime($this->controle->mysql_datetime(date('d-m-Y h:i:s')));
        $this->db_session->saveSessie();
        
        $this->sessie_id = $this->db_session->getSessieId();
    }
    
    public function updateSessie(){
        
        $this->db_session->setSessieId($this->getSessieVar('sessie_id'));
        $this->db_session->setSessieArray($this->sessie_vars);
        $this->db_session->setSessieDatetime($this->controle->mysql_datetime(date('d-m-Y h:i:s')));
        $this->db_session->updateSessie();
    }
}

class testSession {
    public function testSession(){
        try {
            $sessie = new Session();
            $sessie->addSessieVar('gebruiker_id', '1');
            $sessie->addSessieVar('voornaam', 'Sander');
            $sessie->addSessieVar('achternaam', 'van Belleghem');
            $sessie->addSessieVar('sessie_id', '1');
            $sessie->saveSessie();
                        
            echo "<pre>";
            var_dump($sessie);
            echo "</pre>";

        } catch (Exception $e) {
            echo '<pre>';
            echo 'Caught exception: ',  $e->getMessage(), "\n";
            echo '</pre>';
        }
    }
}
?>
